/*
 * @Author: chenzhinjian
 * @Date: 2019-01-18 16:39:28
 * @LastEditTime: 2019-01-19 10:14:00
 * @Description: 
 */
// 判断ie的版本号
const ieVersion = Number(document.documentMode);
// 特殊字符匹配 :-_
const SPECIAL_CHARS_REGEXP = /([\:\-\_]+(.))/g;
// 对mozilla进行特殊判断，即firefox
const MOZ_HACK_REGEXP = /^moz([A-Z])/;
/**
 * 将:-_等变成驼峰式，如foo-bar变成fooBar
 * @param name 要处理的字符串
 * @returns {*} 处理后的字符串
 */
const camelCase = function(name) {
  return name.replace(SPECIAL_CHARS_REGEXP, function(_, separator, letter, offset) {
    return offset ? letter.toUpperCase() : letter; // 开头的不大写，其余的大写
  }).replace(MOZ_HACK_REGEXP, 'Moz$1');  // 对moz进行特殊处理
};
/**
 * 获取样式，分IE9一下和其他两种方式处理
 * @type {Function}
 * @param element 要获取样式的元素
 * @param styleName 要获取的样式名
 */
export const getStyle = ieVersion < 9 ? function(element, styleName) {
  if (isServer) return;  // 如果是服务器端渲染直接返回
  if (!element || !styleName) return null;  // 参数不足
  styleName = camelCase(styleName);  // 将样式名转成驼峰式
  if (styleName === 'float') {  // float特殊处理
    styleName = 'styleFloat';
  }
  try {
    switch (styleName) {
      case 'opacity':  // opacity特殊处理
        try {
          return element.filters.item('alpha').opacity / 100;
        } catch (e) {
          return 1.0;
        }
      default:
        return (element.style[styleName] || element.currentStyle ? element.currentStyle[styleName] : null);
    }
  } catch (e) {
    return element.style[styleName];
  }
} : function(element, styleName) {
  if (isServer) return;
  if (!element || !styleName) return null;
  styleName = camelCase(styleName);
  if (styleName === 'float') {  // float特殊处理
    styleName = 'cssFloat';
  }
  try {
    var computed = document.defaultView.getComputedStyle(element, '');  // defaultView即window对象
    return element.style[styleName] || computed ? computed[styleName] : null;
  } catch (e) {
    return element.style[styleName];
  }
};

/**
 * 设置元素的样式
 * @param element 要设置的元素
 * @param styleName 要设置的样式
 * @param value 要设置的值
 */
export function setStyle(element, styleName, value) {
  if (!element || !styleName) return;

  if (typeof styleName === 'object') {  // 如果是对象则拆分后依次设置
    for (var prop in styleName) {
      if (styleName.hasOwnProperty(prop)) {  // 过滤掉非法的键值对
        setStyle(element, prop, styleName[prop]);
      }
    }
  } else {
    styleName = camelCase(styleName);
    if (styleName === 'opacity' && ieVersion < 9) {  // opacity特殊处理
      element.style.filter = isNaN(value) ? '' : 'alpha(opacity=' + value * 100 + ')';
    } else {
      element.style[styleName] = value;
    }
  }
}
import Vue from 'vue';
const isServer = Vue.prototype.$isServer;
/**
 *  监听添加
 * @param {*} element  DOM对象
 * @param {*} event    事件名
 * @param {*} handler  需要添加的事件
 */
/* istanbul ignore next */
export const on = (function() {
    if (!isServer && document.addEventListener) {
        return function(element, event, handler) {
            if (element && event && handler) {
                element.addEventListener(event, handler, false);
            }
        };
    } else {
        return function(element, event, handler) {
            if (element && event && handler) {
                element.attachEvent('on' + event, handler);
            }
        };
    }
})();

/* istanbul ignore next */
/**
 *  监听销毁
 * @param {*} element  DOM对象
 * @param {*} event    事件名
 * @param {*} handler  需要销毁的事件
 */
export const off = (function() {
    if (!isServer && document.removeEventListener) {
        return function(element, event, handler) {
            if (element && event) {
                element.removeEventListener(event, handler, false);
            }
        };
    } else {
        return function(element, event, handler) {
            if (element && event) {
                element.detachEvent('on' + event, handler);
            }
        };
    }
})();